package com.nfit.shopadmin.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.nfit.shopadmin.mapper.ProductDetailsMapper;
import com.nfit.shopadmin.mapper.ProductMapper;
import com.nfit.shopadmin.mapper.ProductSkuMapper;
import com.nfit.shopadmin.service.ProductService;
import com.nfit.shopmodel.entity.product.Product;
import com.nfit.shopmodel.entity.product.ProductDetails;
import com.nfit.shopmodel.entity.product.ProductSku;
import com.nfit.shopmodel.vo.product.ProductDetailsVo;
import com.nfit.shopmodel.vo.product.ProductSkuVo;
import com.nfit.shopmodel.vo.product.ProductVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * ClassName:ProductServiceImpl
 * Package:com.nfit.shopadmin.service.impl
 * Description
 *
 * @Author L
 * @Create 2024/12/11 10:03
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private ProductSkuMapper productSkuMapper;

    @Autowired
    private ProductDetailsMapper productDetailsMapper;

    /**
     * 查询商品图片作为首页的轮播图图片
     */
    @Override
    public List<Product> getProductImage() {
        List<Product> list = productMapper.getProductImage();
        return list;
    }

    /**
     * 首页热门商品
     */
    @Override
    public PageInfo<ProductVo> getHotProduct(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        // 获取热门商品列表（Product 实体）
        List<Product> list = productMapper.getHotProduct();

        // 创建一个 ProductVo 列表，用于返回
//        List<ProductVo> productVoList = new ArrayList<>();
        List<ProductVo> productVoList = this.EncapsulationProduct(list);
        // 遍历 Product 列表，将每个 Product 转换为 ProductVo
//        for (Product product : list) {
//            ProductVo productVo = new ProductVo();
//
//            // 设置 ProductVo 的字段
//            productVo.setId(product.getId());
//            productVo.setSliderUrls(product.getSliderUrls());
//            productVo.setProductName(product.getName());
//
//            // 假设 Product 实体中没有价格信息，因此需要查询商品 SKU 价格
//            ProductSku productSku = this.getProductPrice(product.getId());
//            productVo.setProductPrice(productSku.getSalePrice());
//
//            // 将转换后的 ProductVo 添加到列表
//            productVoList.add(productVo);
//        }
        // 返回转换后的 ProductVo 列表
        return new PageInfo<>(productVoList);
    }

    /**
     * 根据商品id查询商品详情信息
     * @param productId 商品id
     */
    @Override
    public ProductDetailsVo getByProductId(Long productId) {
        ProductDetailsVo productDetailsVo = new ProductDetailsVo();
        //根据id查询商品
        Product product = productMapper.findById(productId);
        productDetailsVo.setProductId(product.getId()); //商品id
        productDetailsVo.setName(product.getName()); //商品名称
        productDetailsVo.setSpecList(JSON.parseArray(product.getSpecValue())); //商品规格信息,转换为list集合
        productDetailsVo.setSliderUrls(product.getSliderUrls()); //商品轮播图

        //获取同类商品推荐数据(获取二级商品分类下的前10条数据商品)
        List<Product> productList = productMapper.getSimilarRecommendList(product.getCategory2Id());
        //封装同类商品推荐数据
        productDetailsVo.setSimilarRecommendList(this.EncapsulationProduct(productList));

        //根据商品id查询对应的sku
        List<ProductSku> productSkuList = productSkuMapper.findByProductIdSkus(product.getId());
        List<ProductSkuVo> productSkuVoList = productSkuList.stream().map(sku -> {
            ProductSkuVo productSkuVo = new ProductSkuVo();
            productSkuVo.setId(sku.getId());
            productSkuVo.setSkuName(sku.getSkuName()); //List集合
            productSkuVo.setThumbImg(sku.getThumbImg());
            productSkuVo.setSalePrice(sku.getSalePrice());
            List<Map<String,String>> converSpec = this.convertSpecs(sku.getSkuSpec());
            productSkuVo.setSkuNameArr(converSpec);
            productSkuVo.setStockNum(sku.getStockNum());
            productSkuVo.setSaleNum(sku.getSaleNum());
            return productSkuVo; //确保返回一个完整的ProductSkuVo
        }).collect(Collectors.toList());//收集成列表
        productDetailsVo.setProductSku(productSkuVoList); //封装数据

        //根据商品id查询商品详情信息图片
        ProductDetails productDetails = productDetailsMapper.findByProductId(product.getId());
        productDetailsVo.setProductDetails(productDetails.getImageUrls()); //封装商品详情图片
        return productDetailsVo;
    }

    /**
     * 封装productVo
     * @param val 查询数据库中的值，封装成vo
     * @return 返回封装好的数据
     */
    private List<ProductVo> EncapsulationProduct(List<Product> val){
        if (val.isEmpty()){
            return null;
        }
        //封装productVo
        List<ProductVo> collect = val.stream().map(p -> {
            ProductVo productVo = new ProductVo();
            productVo.setId(p.getId());
            productVo.setProductName(p.getName());
            productVo.setSliderUrls(p.getSliderUrls());
            //调用方法, 假设 Product 实体中没有价格信息，因此需要查询商品 SKU 价格,
            ProductSku productSku = this.getProductPrice(p.getId());
            productVo.setProductPrice(productSku.getSalePrice());
            return productVo;
        }).collect(Collectors.toList());
        return collect;
    }

    /**
     *
     *将规格字符串转换为目标
     * @param val 要转换的值
     */
    private static List<Map<String,String>> convertSpecs(String val){
        List<Map<String, String>> specs = new ArrayList<>();

        // 1. 分割规格字符串，按逗号分割成每个规格项,颜色:冰晶白,内存:12GB+512GB
        String[] specArray = val.split(",");

        // 2. 遍历每个规格项
        for (String item : specArray) {
            // 按冒号分割 key 和 value
            String[] keyValue = item.split(":");

            // 确保分割后有两个部分
            if (keyValue.length == 2) {
                Map<String, String> spec = new HashMap<>();
                spec.put("name", keyValue[0].trim());       // 规格名称
                spec.put("valueName", keyValue[1].trim()); // 规格值
                specs.add(spec);
            }
        }
        return specs;
    }



    /**
     * 根据商品id查询商品sku
     * @param productId 商品id
     */
    private ProductSku getProductPrice(Long productId) {
        // 查询商品 SKU 表，根据商品 ID 获取对应的售价
        // 只获取第一个（最低） SKU 的价格
        ProductSku productSku = productSkuMapper.findByProductId(productId);
        return productSku;
    }

}
